﻿#ifndef PST_TEXTFILEPARSER_H
#define PST_TEXTFILEPARSER_H

#include <QObject>
#include <QList>
#include <QHash>
#include <QVector>
#include <vtkSmartPointer.h>
#include "InfomationCurve2DBasical.h"
class vtkTable;
class vtkPlotLine;
class vtkPoints;
class vtkDelimitedTextReader;

namespace pst
{
    class  TextFileParser : public QObject
    {
        Q_OBJECT
    public:
        explicit TextFileParser(QObject* parent = Q_NULLPTR);
        ~TextFileParser();

    public:
        void SetFileName(const QString& fileName);
        QString GetFileName();

        vtkDelimitedTextReader* getTextReader();

        bool Update();

        /// @brief 设置是否取对数
        /// @param log 是否取对数
        void SetLogTheData(bool log);
        /// @brief 获取是否设置取了对数
        /// @return 是否取对数
        bool GetLogTheData();

        /// @brief 设置是否归一化
        /// @param log 是否归一化
        void SetNormalizeTheData(bool normolized);
        /// @brief 获取是否设置归一化
        /// @return 是否归一化
        bool GetNormalizeTheData();

        /// @brief 设置取对数时的因子，默认10
        /// @para factory 因子
        void SetLogFactory(double factory);

        /// @brief  获取取对数时的因子，默认10
         /// @return 因子
        double GetLogFactory();

        /// @brief 获取原始表格数据
        /// @return 
        vtkTable* getOriginalTable();

        QVector<QString> getEachColNameOfKey();
        QVector<QString> getEachColUnitOfKey();
        QVector<QVector<double>> getEachColDataOfKey();

        QVector<QString> getEachColNameOfValue();
        QVector<QString> getEachColUnitOfValue();
        QVector<QVector<double>> getEachColDataOfValue();

        QHash<QVector<double>, QVector<double>> getValueMatrix();

        /// @brief 设置扫描参数的下标
        /// @param index 表明那一列将作为扫描参数被遍历
        void setScanParameterIndex(int index);
        int getScanParameterIndex();

        void setOtherKeyParameter(const QVector<QVector<double>>& keyParaList);
        QVector<QVector<double>> getOtherKeyParameter();

        /// @brief 获得生成的结果，valueId在有多个值时，一个key对应多个value
        /// @param valueId 需要
        /// @param returnTable 所有结果返回到一个表中，第一列为扫描参数，其他列为结果曲线
        void getChosenLinesFromKey(QList<int> valueId, vtkTable* returnTable);

        void getChosenLinesFromKey(QList<int> valueId,
            QList<InfomationCurve2DBasical>& yList);

        /// 用于极坐标绘图
        /// note: 此函数仅用于获取原来是 "Theta||deg||key","Phi||deg||key","Frequency||GHz||key","Gain||None||value"格式的文件数据，
        /// note:内部将球坐标转为直角坐标结果，获取的为直角坐标点
        /// @brief 获得生成的结果，valueId在有多个值时，一个key对应多个value
        /// @param valueId 需要
        /// @param radiusBestRange 用于标签显示的最恰最小最大值
        /// @param minValue 半径轴最小值，小于该值，置为0. 否则数值应加上最小值。
        /// resultPointsList 每个vtkPoints代表一个曲线结果
        void getChosenPointsListFromKey(QList<int> valueId,
            QList<vtkSmartPointer<vtkPoints>>& resultPointsList,
            QList<vtkSmartPointer<vtkPoints>>& resultPointsList_sphere,
            QList<QString>& lineName, double radiusBestRange[2], bool log, bool normalize, double minValue, bool enableCustomRange);

        QString getErrorMessage() const;
    private:
        bool readFile();

        /// @brief 解析文件表头，分析哪些是key, 哪些是value，并分别获取名字
        bool parseTitleName();

        void clearData();

        bool generateValueMatrix();

        /// @brief 根据扫描参数和
        //void generateChosenKeyList();
    private:
        QString m_fileName;
        vtkTable* m_originalTable;                                         // 读取的原始表格
        vtkDelimitedTextReader* m_reader;

        QVector<QString> m_eachColNameOfKey;                                 // 每一Key列的列名字
        QVector<QString> m_eachColUnitOfKey;                                 // 每一Key列的单位
        QVector<QVector<double>> m_eachColDataOfKey;                           // 每一key列包含的数据
        int m_keyLenth;                                                    // 每个key应该有的的长度

        QVector<QString> m_eachColNameOfValue;                               // 每一value列的列名字
        QVector<QString> m_eachColUnitOfValue;                               // 每一value列的单位
        QVector<QVector<double>> m_eachColDataOfValue;                         // 每一value列包含的数据
        int m_valueLenth;                                                   // 每个value应该有的的长度, 即每个key对应的value有多少个

        QHash<QVector<double>, QVector<double>> m_valueMatrix;                 // key为扫描参数, value为对应的值

        bool m_isSetLog;
        bool m_isSetNormalized;
        double m_logFactory;                                               // 取对数时的系数

        int m_scanParaIndex;                                               // 选择作为扫描参数的下标
        QVector<QVector<double>> m_chosenKeyList;                              // 选择的其他Key的列表

        vtkTable* m_chosenDataTable;                                       // 选择的数据生成的临时表，用于生成曲线

        QString m_errorMessage;
        //QList<vtkSmartPointer<vtkPlotLine>>                                 
    };
} //namespace qvtk

#endif
